/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.upc.embajada.controller;

/**
 *
 * @author rv
 */
import edu.upc.embajada.entity.Distrito;
import edu.upc.embajada.entity.Solicitud;
import edu.upc.embajada.entity.SolicitudDisplay;
import edu.upc.embajada.entity.Usuario;
import edu.upc.embajada.service.DistritoService;
import edu.upc.embajada.service.SolicitudService;
import edu.upc.embajada.service.UsuarioService;
import edu.upc.embajada.ws.reniec.CiudadanoEntity;
import edu.upc.embajada.ws.reniec.ReniecService;
import edu.upc.embajada.ws.sunarp.SunarpMsg;
import edu.upc.embajada.ws.sunarp.SunarpServiceImpl;
import edu.upc.embajada.ws.sunat.ContribuyenteEntity;
import edu.upc.embajada.ws.sunat.SunatService;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.servlet.ModelAndView;

/**
 *
 * @author gian
 */
@Controller("solicitudController")
public class SolicitudController {

    @Autowired
    private SolicitudService solicitudService;
    @Autowired
    private UsuarioService usuarioService;
    @Autowired
    private DistritoService distritoService;
    @Autowired
    private ReniecService reniecService;
    @Autowired
    private SunatService sunatService;
    //
    private SunarpServiceImpl sunarpService = new SunarpServiceImpl();
    private static Logger log = LoggerFactory.getLogger(SolicitudController.class);

    @RequestMapping(value = "/visa/new", method = RequestMethod.GET)
    public ModelAndView newSolicitud() {
        ModelAndView mav = new ModelAndView("visa/new");
        Solicitud solicitud = new Solicitud();
        mav.getModelMap().put("solicitud", solicitud);
        return mav;
    }

    @RequestMapping(value = "/visa/new", method = RequestMethod.POST)
    public ModelAndView newSolicitud(@ModelAttribute("solicitud") Solicitud solicitud, SessionStatus status, HttpSession session) {
        ModelAndView mav = new ModelAndView("visa/new");

        try {

            Integer id = solicitudService.crear(solicitud);

            Solicitud sol = solicitudService.obtener(id);

            if (sol.getIdEstado() == 2) {
                session.setAttribute("respuestaEval", "Favor presentarse el " + new SimpleDateFormat("dd/MM/yyyy").format(sol.getFecEntrevista()) + " a las " + sol.getHoraEntrevista());
            } else {
                session.setAttribute("respuestaEval", "Lo sentimos, en estos momentos no es elegible para una visa");
            }

            status.setComplete();
            mav = new ModelAndView("redirect:/pages/visa/resultado");
            return mav;

        } catch (Exception ex) {
            mav.addObject("msg", ex.getMessage());
        }
        return mav;

    }

    @RequestMapping("/visa/resultado")
    public ModelAndView index(HttpSession session) {
        ModelAndView mav = new ModelAndView("visa/resultado");

        mav.addObject("resultado", (String) session.getAttribute("respuestaEval"));
        return mav;
    }

    @RequestMapping("/visa/consultar")
    public ModelAndView consultarSolicitudes(HttpServletRequest request) {
        ModelAndView mav;
        mav = new ModelAndView("visa/consultar");

        Authentication auth = SecurityContextHolder.getContext().getAuthentication();

        Usuario usuario = usuarioService.obtenerPorCodEmpleado(auth.getName());

        // Calendar cal = Calendar.getInstance();
        // cal.set(2013, 04, 21, 0, 0, 0);
        // Date fecha = cal.getTime();

        Date fecha = Calendar.getInstance().getTime();
        fecha.setHours(0);
        fecha.setMinutes(0);
        fecha.setSeconds(0);

        // List<Solicitud> solicitudes = solicitudService.obtenerPorUsuarioFecha(auth.getName(), fecha);

        // para la demo es con esta para no estar preocupados de la fecha exacta
        List<Solicitud> solicitudes = solicitudService.obtenerPorUsuario(auth.getName());
        mav.addObject("solicitudes", solicitudes);
        mav.addObject("usuario", usuario);

        return mav;

    }

    @RequestMapping(value = "/visa/detalle", method = RequestMethod.GET)
    public ModelAndView detalleSolicitud(@RequestParam("id") Integer idSolicitud) throws IOException {
        ModelAndView mav = new ModelAndView("visa/detalle");

        Solicitud solicitud = solicitudService.obtener(idSolicitud);

        // complementa información para mostrarla al evaluador
        Distrito distrito = distritoService.obtener(solicitud.getIdDistrito());
        SolicitudDisplay solicitudDisplay = new SolicitudDisplay(solicitud, distrito.getNombre());

        try {
            // complementa información de RENIEC
            CiudadanoEntity ciud = reniecService.getCiudadanoFull(solicitud.getDocIdentidad());
            solicitudDisplay.setEstadoCivil(ciud.getEstadoCivil().getValue());
            solicitudDisplay.setGradoInstruccion(ciud.getGradoInstruccion().getValue());
            solicitudDisplay.setEstatura(ciud.getEstatura());
            BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(ciud.getFoto().getValue()));
            File imageFile = new File("c:/temp/" + solicitud.getDocIdentidad() + ".jpg");
            ImageIO.write(bufferedImage, "jpg", imageFile);

            // complementa información de SUNARP
            if (!("".equals(solicitud.getPlaca1()))) {
                SunarpMsg infoAuto1 = sunarpService.getInfoSunarp(solicitud.getPlaca1());
                solicitudDisplay.setMarca1(infoAuto1.getMarca());
                solicitudDisplay.setModelo1(infoAuto1.getModelo());
            } else {
                solicitudDisplay.setPlaca1("No cuenta con auto");
                solicitudDisplay.setMarca1("No aplica");
                solicitudDisplay.setModelo1("No aplica");
            }
            //
            if (!("".equals(solicitud.getPlaca2()))) {
                SunarpMsg infoAuto2 = sunarpService.getInfoSunarp(solicitud.getPlaca2());
                solicitudDisplay.setMarca2(infoAuto2.getMarca());
                solicitudDisplay.setModelo2(infoAuto2.getModelo());
            } else {
                solicitudDisplay.setPlaca2("No cuenta con auto");
                solicitudDisplay.setMarca2("No aplica");
                solicitudDisplay.setModelo2("No aplica");
            }
            //
            if (!("".equals(solicitud.getPlaca3()))) {
                SunarpMsg infoAuto3 = sunarpService.getInfoSunarp(solicitud.getPlaca3());
                solicitudDisplay.setMarca3(infoAuto3.getMarca());
                solicitudDisplay.setModelo3(infoAuto3.getModelo());
            } else {
                solicitudDisplay.setPlaca3("No cuenta con auto");
                solicitudDisplay.setMarca3("No aplica");
                solicitudDisplay.setModelo3("No aplica");
            }

            // complementa información de SUNAT
            if (!(solicitud.getRUC_empresa().isEmpty())) {
                ContribuyenteEntity contribuyente = sunatService.getContribuyente(solicitud.getRUC_empresa());
                solicitudDisplay.setNombreEmpresa(contribuyente.getNombreComercial().getValue());
                solicitudDisplay.setEstadoEmpresa(contribuyente.getEstadoContribuyente().getValue());
                
            } else {
                solicitudDisplay.setNombreEmpresa("No trabaja");
                solicitudDisplay.setEstadoEmpresa("No aplica");
            }


        } catch (Exception ex) {
            mav.addObject("msg", ex.getMessage());
        }

        mav.getModelMap().put("solicitudDisplay", solicitudDisplay);

        return mav;
    }

    @RequestMapping(value = "/visa/detalle", method = RequestMethod.POST)
    public ModelAndView detalleSolicitud(@ModelAttribute("solicitudDisplay") SolicitudDisplay solicitudDisplay, @RequestParam(required = false, value = "aprobar") String aprobarFlag, SessionStatus status) {
        ModelAndView mav = new ModelAndView("visa/detalle");

        try {
            if (aprobarFlag != null) {
                // aprobado
                solicitudService.cambiaEstado(solicitudDisplay.getIdSolicitud(), 3);
            } else {
                // rechazado
                solicitudService.cambiaEstado(solicitudDisplay.getIdSolicitud(), 4);
            }

            status.setComplete();
            mav = new ModelAndView("redirect:/pages/visa/consultar");
            return mav;

        } catch (Exception ex) {
            mav.addObject("msg", ex.getMessage());
        }
        return mav;

    }

    @RequestMapping("/mostrarPersona.htm")
    public void mostrarFirma(@RequestParam("id") Integer docIdentidad, HttpServletResponse response) {

        response.setContentType("image/jpeg");

        OutputStream output = null;
        FileInputStream input = null;

        File file = new File("C:/temp/" + docIdentidad + ".jpg");

        try {
            output = response.getOutputStream();
            input = new FileInputStream(file);
            byte[] buffer = new byte[(int) file.length()];
            input.read(buffer);
            response.setContentLength(buffer.length);
            output.write(buffer);

        } catch (Exception e) {
        } finally {
            try {
                input.close();
                output.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    // Esto es para convertir los datos tipo Date que vienen de la vista a un formato adecuado para la BD
    @InitBinder
    public void initBinder(WebDataBinder webDataBinder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        dateFormat.setLenient(false);
        webDataBinder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
    }
}